// 父类构造函数
function Parent(name) {
  this.name = name // 实例属性
  this.colors = ['red'] // 引用类型属性
}

// 父类原型方法
Parent.prototype.sayName = function () {
  console.log(this.name)
}

// 子类构造函数
function Child(name, age) {
  Parent.call(this, name) // 仅调用一次父类构造函数
  this.age = age // 子类自有属性
}

// 寄生组合继承的核心：继承父类原型
;(function () {
  // 创建一个空对象，其原型指向 Parent.prototype
  const prototype = Object.create(Parent.prototype)
  // 将该对象赋值给 Child.prototype
  Child.prototype = prototype
  // 修复 constructor 属性
  prototype.constructor = Child
})()

// 子类原型方法
Child.prototype.sayAge = function () {
  console.log(this.age)
}

// 测试
const child = new Child('Alice', 30)
child.sayName() // 'Alice'（继承自父类原型）
child.sayAge() // 30（子类自有方法）
console.log(child.colors) // ['red']（继承自父类实例属性）
